home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-13 / mg2a_src.zip / DEF.H < prev    next >
C/C++ Source or Header  |  1988-08-23  |  10KB  |  312 lines

  1. /*
  2.  * This file is the general header file for all parts
  3.  * of the MicroEMACS display editor. It contains all of the
  4.  * general definitions and macros. It also contains some
  5.  * conditional compilation flags. All of the per-system and
  6.  * per-terminal definitions are in special header files.
  7.  * The most common reason to edit this file would be to zap
  8.  * the definition of CVMVAS or BACKUP.
  9.  */
  10. #include    "sysdef.h"        /* Order is critical.        */
  11. #include    "ttydef.h"
  12. #include    "chrdef.h"
  13.  
  14. /*
  15.  * If your system and/or compiler does not support the "void" type
  16.  * then define NO_VOID_TYPE in sysdef.h.  In the absence of some
  17.  * other definition for VOID, the default in that case will be to
  18.  * turn it into an int, which works with most compilers that don't
  19.  * support void.  In the absence of any definition of VOID or
  20.  * NO_VOID_TYPE, the default is to assume void is supported, which
  21.  * should be the case for most modern C compilers.
  22.  */
  23.  
  24. #ifdef NO_VOID_TYPE
  25. #  undef VOID
  26. #  define VOID int            /* Default for no void is int */
  27. #else
  28. #ifndef VOID
  29. #  define VOID void            /* Just use normal void */
  30. #endif /* VOID */
  31. #endif /* NO_VOID_TYPE */
  32.  
  33. #ifdef    NO_MACRO
  34. #ifndef NO_STARTUP
  35. #define NO_STARTUP            /* NO_MACRO implies NO_STARTUP */
  36. #endif
  37. #endif
  38.  
  39. typedef int (*PF)();            /* generaly useful type */
  40.  
  41. /*
  42.  * Table sizes, etc.
  43.  */
  44. #define NFILEN    80            /* Length, file name.        */
  45. #define NBUFN    24            /* Length, buffer name.        */
  46. #define NLINE    256            /* Length, line.        */
  47. #define PBMODES 4            /* modes per buffer        */
  48. #define NKBDM    256            /* Length, keyboard macro.    */
  49. #define NPAT    80            /* Length, pattern.        */
  50. #define HUGE    1000            /* A rather large number.    */
  51. #define NSRCH    128            /* Undoable search commands.    */
  52. #define NXNAME    64            /* Length, extended command.    */
  53. #define NKNAME    20            /* Length, key names        */
  54. /*
  55.  * Universal.
  56.  */
  57. #define FALSE    0            /* False, no, bad, etc.        */
  58. #define TRUE    1            /* True, yes, good, etc.    */
  59. #define ABORT    2            /* Death, ^G, abort, etc.    */
  60.  
  61. #define KPROMPT 2            /* keyboard prompt        */
  62.  
  63. /*
  64.  * These flag bits keep track of
  65.  * some aspects of the last command. The CFCPCN
  66.  * flag controls goal column setting. The CFKILL
  67.  * flag controls the clearing versus appending
  68.  * of data in the kill buffer.
  69.  */
  70. #define CFCPCN    0x0001            /* Last command was C-P, C-N    */
  71. #define CFKILL    0x0002            /* Last command was a kill    */
  72. #define CFINS    0x0004            /* Last command was self-insert */
  73.  
  74. /*
  75.  * File I/O.
  76.  */
  77. #define FIOSUC    0            /* Success.            */
  78. #define FIOFNF    1            /* File not found.        */
  79. #define FIOEOF    2            /* End of file.            */
  80. #define FIOERR    3            /* Error.            */
  81. #define FIOLONG 4            /* long line partially read    */
  82.  
  83. /*
  84.  * Directory I/O.
  85.  */
  86. #define DIOSUC    0            /* Success.            */
  87. #define DIOEOF    1            /* End of file.            */
  88. #define DIOERR    2            /* Error.            */
  89.  
  90. /*
  91.  * Display colors.
  92.  */
  93. #define CNONE    0            /* Unknown color.        */
  94. #define CTEXT    1            /* Text color.            */
  95. #define CMODE    2            /* Mode line color.        */
  96.  
  97. /* Flags for keyboard involked functions */
  98.  
  99. #define FFUNIV        1        /* universal argument        */
  100. #define FFNEGARG    2        /* negitive only argument    */
  101. #define FFOTHARG    4        /* other argument        */
  102. #define FFARG        7        /* any argument            */
  103. #define FFRAND        8        /* Called by other function    */
  104.  
  105. /*
  106.  * Flags for "eread".
  107.  */
  108. #define EFFUNC    0x0001            /* Autocomplete functions.    */
  109. #define EFBUF    0x0002            /* Autocomplete buffers.    */
  110. #define EFFILE    0x0004            /* " files (maybe someday)    */
  111. #define EFAUTO    0x0007            /* Some autocompleteion on    */
  112. #define EFNEW    0x0008            /* New prompt.            */
  113. #define EFCR    0x0010            /* Echo CR at end; last read.    */
  114.  
  115. /*
  116.  * Flags for "ldelete"/"kinsert"
  117.  */
  118.  
  119. #define KNONE    0
  120. #define KFORW    1
  121. #define KBACK    2
  122.  
  123. /*
  124.  * All text is kept in circularly linked
  125.  * lists of "LINE" structures. These begin at the
  126.  * header line (which is the blank line beyond the
  127.  * end of the buffer). This line is pointed to by
  128.  * the "BUFFER". Each line contains a the number of
  129.  * bytes in the line (the "used" size), the size
  130.  * of the text array, and the text. The end of line
  131.  * is not stored as a byte; it's implied. Future
  132.  * additions will include update hints, and a
  133.  * list of marks into the line.
  134.  */
  135. typedef struct    LINE {
  136.     struct    LINE *l_fp;        /* Link to the next line    */
  137.     struct    LINE *l_bp;        /* Link to the previous line    */
  138.     short    l_size;            /* Allocated size        */
  139.     short    l_used;            /* Used size            */
  140. #ifndef ZEROARRAY
  141.     char    l_text[1];        /* A bunch of characters.    */
  142. #else
  143.     char    l_text[];        /* A bunch of characters.    */
  144. #endif
  145. }    LINE;
  146.  
  147. /*
  148.  * The rationale behind these macros is that you
  149.  * could (with some editing, like changing the type of a line
  150.  * link from a "LINE *" to a "REFLINE", and fixing the commands
  151.  * like file reading that break the rules) change the actual
  152.  * storage representation of lines to use something fancy on
  153.  * machines with small address spaces.
  154.  */
  155. #define lforw(lp)    ((lp)->l_fp)
  156. #define lback(lp)    ((lp)->l_bp)
  157. #define lgetc(lp, n)    (CHARMASK((lp)->l_text[(n)]))
  158. #define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
  159. #define llength(lp)    ((lp)->l_used)
  160. #define ltext(lp)    ((lp)->l_text)
  161.  
  162. /*
  163.  * All repeated structures are kept as linked lists of structures.
  164.  * All of these start with a LIST structure (except lines, which
  165.  * have their own abstraction). This will allow for
  166.  * later conversion to generic list manipulation routines should
  167.  * I decide to do that. it does mean that there are four extra
  168.  * bytes per window. I feel that this is an acceptable price,
  169.  * considering that there are usually only one or two windows.
  170.  */
  171. typedef struct LIST {
  172.     union {
  173.         struct WINDOW    *l_wp;
  174.         struct BUFFER    *x_bp;    /* l_bp is used by LINE */
  175.         struct LIST    *l_nxt;
  176.     } l_p;
  177.     char    *l_name;
  178. } LIST;
  179. /*
  180.  * Usual hack - to keep from uglifying the code with lotsa
  181.  * references through the union, we #define something for it.
  182.  */
  183. #define l_next    l_p.l_nxt
  184.  
  185. /*
  186.  * There is a window structure allocated for
  187.  * every active display window. The windows are kept in a
  188.  * big list, in top to bottom screen order, with the listhead at
  189.  * "wheadp". Each window contains its own values of dot and mark.
  190.  * The flag field contains some bits that are set by commands
  191.  * to guide redisplay; although this is a bit of a compromise in
  192.  * terms of decoupling, the full blown redisplay is just too
  193.  * expensive to run for every input character.
  194.  */
  195. typedef struct    WINDOW {
  196.     LIST    w_list;            /* List header               */
  197.     struct    BUFFER *w_bufp;        /* Buffer displayed in window    */
  198.     struct    LINE *w_linep;        /* Top line in the window    */
  199.     struct    LINE *w_dotp;        /* Line containing "."        */
  200.     struct    LINE *w_markp;        /* Line containing "mark"    */
  201.     short    w_doto;            /* Byte offset for "."        */
  202.     short    w_marko;        /* Byte offset for "mark"    */
  203.     char    w_toprow;        /* Origin 0 top row of window    */
  204.     char    w_ntrows;        /* # of rows of text in window    */
  205.     char    w_force;        /* If NZ, forcing row.        */
  206.     char    w_flag;            /* Flags.            */
  207. }    WINDOW;
  208. #define w_wndp    w_list.l_p.l_wp
  209. #define w_name    w_list.l_name
  210.  
  211. /*
  212.  * Window flags are set by command processors to
  213.  * tell the display system what has happened to the buffer
  214.  * mapped by the window. Setting "WFHARD" is always a safe thing
  215.  * to do, but it may do more work than is necessary. Always try
  216.  * to set the simplest action that achieves the required update.
  217.  * Because commands set bits in the "w_flag", update will see
  218.  * all change flags, and do the most general one.
  219.  */
  220. #define WFFORCE 0x01            /* Force reframe.        */
  221. #define WFMOVE    0x02            /* Movement from line to line.    */
  222. #define WFEDIT    0x04            /* Editing within a line.    */
  223. #define WFHARD    0x08            /* Better to a full display.    */
  224. #define WFMODE    0x10            /* Update mode line.        */
  225.  
  226. /*
  227.  * Text is kept in buffers. A buffer header, described
  228.  * below, exists for every buffer in the system. The buffers are
  229.  * kept in a big list, so that commands that search for a buffer by
  230.  * name can find the buffer header. There is a safe store for the
  231.  * dot and mark in the header, but this is only valid if the buffer
  232.  * is not being displayed (that is, if "b_nwnd" is 0). The text for
  233.  * the buffer is kept in a circularly linked list of lines, with
  234.  * a pointer to the header line in "b_linep".
  235.  */
  236. typedef struct    BUFFER {
  237.     LIST    b_list;            /* buffer list pointer        */
  238.     struct    BUFFER *b_altb;        /* Link to alternate buffer    */
  239.     struct    LINE *b_dotp;        /* Link to "." LINE structure    */
  240.     struct    LINE *b_markp;        /* ditto for mark        */
  241.     struct    LINE *b_linep;        /* Link to the header LINE    */
  242.     struct    MAPS_S *b_modes[PBMODES]; /* buffer modes        */
  243.     short    b_doto;            /* Offset of "." in above LINE    */
  244.     short    b_marko;        /* ditto for the "mark"        */
  245.     short    b_nmodes;        /* number of non-fundamental modes */
  246.     char    b_nwnd;            /* Count of windows on buffer    */
  247.     char    b_flag;            /* Flags            */
  248.     char    b_fname[NFILEN];    /* File name            */
  249. }    BUFFER;
  250. #define b_bufp    b_list.l_p.x_bp
  251. #define b_bname b_list.l_name
  252.  
  253. #define BFCHG    0x01            /* Changed.            */
  254. #define BFBAK    0x02            /* Need to make a backup.    */
  255. #ifdef    NOTAB
  256. #define BFNOTAB 0x04            /* no tab mode            */
  257. #endif
  258. #define BFOVERWRITE 0x08        /* overwrite mode        */
  259.  
  260. /*
  261.  * This structure holds the starting position
  262.  * (as a line/offset pair) and the number of characters in a
  263.  * region of a buffer. This makes passing the specification
  264.  * of a region around a little bit easier.
  265.  */
  266. typedef struct    {
  267.     struct    LINE *r_linep;        /* Origin LINE address.        */
  268.     short    r_offset;        /* Origin LINE offset.        */
  269.     RSIZE    r_size;            /* Length in characters.    */
  270. }    REGION;
  271.  
  272. /*
  273.  * Externals.
  274.  */
  275. extern    int    thisflag;
  276. extern    int    lastflag;
  277. extern    int    curgoal;
  278. extern    int    epresf;
  279. extern    int    sgarbf;
  280. extern    int    mode;
  281. extern    WINDOW    *curwp;
  282. extern    BUFFER    *curbp;
  283. extern    WINDOW    *wheadp;
  284. extern    BUFFER    *bheadp;
  285. extern    char    pat[];
  286. extern    BUFFER    *bfind();
  287. extern    WINDOW    *popbuf();
  288. extern    WINDOW    *wpopup();
  289. extern    LINE    *lalloc();
  290. extern    LINE    *lallocx();
  291. extern    VOID    ewprintf();
  292. extern    int    nrow;
  293. extern    int    ncol;
  294. extern    int    ttrow;
  295. extern    int    ttcol;
  296. extern    int    tceeol;
  297. extern    int    tcinsl;
  298. extern    int    tcdell;
  299. extern    char    cinfo[];
  300. extern    char    *keystrings[];
  301. extern    VOID    update();
  302. extern    char    *keyname();
  303. extern    char    *adjustname();
  304. extern    VOID    kdelete();
  305. extern    VOID    lchange();
  306. /*
  307.  * Standard I/O.
  308.  */
  309. extern    char    *strcpy();
  310. extern    char    *strcat();
  311. extern    char    *malloc();
  312.